home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC World Komputer 2010 April
/
PCWorld0410.iso
/
pluginy Firefox
/
1833
/
1833.xpi
/
modules
/
yoonoKeyValueDB.js
< prev
next >
Wrap
Text File
|
2009-12-16
|
10KB
|
301 lines
var EXPORTED_SYMBOLS = ["YOONO_KEYVALUEDB"];
Components.utils.import("resource://yoono/yoonoLog.js");
var log = YOONO_LOG;
const YOONO_DIR = "yoono";
const YOONO_DB_FILE = "anonUser.sqlite"; // new user nb name
const PERMS_FILE = 0655;
const CI = Components.interfaces;
const CL = Components.classes;
const DIRSERVICE = CL['@mozilla.org/file/directory_service;1'].getService(CI.nsIProperties);
const YOONO_KEYVALUEDB = {};
YOONO_KEYVALUEDB.getCurrentDBFileName = function() {
return(this.dbFileName);
};
YOONO_KEYVALUEDB.getDBFileName = function() {
var dbFileName = this.loginToFileName() + '.sqlite';
return(dbFileName);
};
YOONO_KEYVALUEDB.loginToFileName = function() {
Components.utils.import("resource://yoono/yoonoService.js"); // strangely needed here too
var fileName = 'anonUser';
var userData = YOONO_CMPT.getUserCredential();
if(userData && !userData.anonymous) {
fileName = YOONO_CMPT.escapeFileName(userData.login);
}
return(fileName);
}
/**
* This method closes the database, renames the current file to the new file, and reopens the database
*/
YOONO_KEYVALUEDB.switchDB = function() {
this.closeDB();
var currentFileName = this.getDBFileName();
var filePath = YOONO_DIRSERVICE.get("ProfDS", CI.nsIFile)
filePath.append('yoono');
var currentFile = filePath.clone();
var newFilePath = filePath.clone();
currentFile.append(currentFileName);
var newFileName = this.getDBFileName();
newFilePath.append(newFileName);
if(newFilePath.exists()) {
newFilePath.remove(false);
}
currentFile.moveTo(filePath, newFileName);
// DB will be reopenned when it's needed
}
// this is called only if this DB is needed
YOONO_KEYVALUEDB.initDB = function() {
try {
if(this.mDBConn) return;
log.debug("Initializing DB");
var dbFile = DIRSERVICE.get("ProfDS", CI.nsIFile)
dbFile.append(YOONO_DIR);
var userDbFile = dbFile.clone();
dbFile.append(YOONO_DB_FILE);
this.dbFileName = this.getDBFileName();
userDbFile.append(this.dbFileName);
// If default anonUser.sqlite file exists and no username.sqlite file exists
// rename the former to the latter
if(dbFile.exists() && !userDbFile.exists()) {
dbFile.moveTo(null, this.dbFileName);
}
dbFile = DIRSERVICE.get("ProfDS", CI.nsIFile)
dbFile.append(YOONO_DIR);
dbFile.append(this.dbFileName);
// database not yet created : create it !
var creation = false;
if(!dbFile.exists()) {
dbFile.create(CI.nsIFile.NORMAL_FILE_TYPE, PERMS_FILE);
creation = true;
}
var storageService = CL["@mozilla.org/storage/service;1"].getService(CI.mozIStorageService);
this.mDBConn = storageService.openDatabase(dbFile);
// statements will be initialized the first time they are needed... they might never be...
this.getKeyValueStatement = null;
this.setKeyValueStatement = null;
this.deleteKeyValueStatement = null;
this.getKeyValueListStatement = null;
if(creation) {
this.mDBConn.executeSimpleSQL("CREATE TABLE keyvalues (key STRING PRIMARY KEY, value STRING, expire INTEGER)");
}
} catch(e) {
log.exception(e);
this.mDBConn = null;
}
};
YOONO_KEYVALUEDB.closeDB = function() {
try {
if(!this.mDBConn) return;
log.debug("Closing DB");
// Since Gecko 1.9M9, must call finalize on statements before closing
if((null != this.getKeyValueStatement) && ('finalize' in this.getKeyValueStatement))
this.getKeyValueStatement.finalize();
if((null != this.setKeyValueStatement) && ('finalize' in this.setKeyValueStatement))
this.setKeyValueStatement.finalize();
if((null != this.deleteKeyValueStatement) && ('finalize' in this.deleteKeyValueStatement))
this.deleteKeyValueStatement.finalize();
if((null != this.getKeyValueListStatement) && ('finalize' in this.getKeyValueListStatement))
this.getKeyValueListStatement.finalize();
this.getKeyValueStatement = null;
this.setKeyValueStatement = null;
this.deleteKeyValueStatement = null;
this.getKeyValueListStatement = null;
// Commit current transaction
if (this.commitTimer)
this.commitTimer.stop();
// Since Gecko 1.9M8, must call close on db
if('close' in this.mDBConn)
this.mDBConn.close();
log.debug("DB Closed!");
this.mDBConn = null;
} catch(e) {
log.exception(e);
}
}
YOONO_KEYVALUEDB.getKeyValue = function(key) {
var value = null;
var expire = 0;
try {
this.initDB();
if(!this.mDBConn) return value;
if(!this.getKeyValueStatement) {
this.getKeyValueStatement = this.mDBConn.createStatement("SELECT value, expire FROM keyvalues where key = ?1");
}
this.getKeyValueStatement.bindUTF8StringParameter(0, key);
var now = Math.floor((new Date().getTime())/1000);
// there should be only one...
while (this.getKeyValueStatement.executeStep()) {
value = this.getKeyValueStatement.getUTF8String(0);
expire = this.getKeyValueStatement.getInt32(1);
}
} catch(e) {
log.exception(e);
} finally {
this.getKeyValueStatement.reset();
}
if((expire != 0) && (expire <= now)) {
log.debug('Deleting expired key : ' + key + '=' + value);
this.deleteKeyValue(key);
value = null;
} else {
/*
var logVal = value;
if(value && (value.length>500)) {
logVal = value.substr(0, 230) + ' [... VALUE TOO LARGE TO BE LOGGED ...] ' + value.substr(value.length - 250);
}
log.debug('Key found : ' + key + ' valid till ' + expire + ', value : ' + logVal);
*/
}
return(value);
};
YOONO_KEYVALUEDB.deleteKeyValue = function(key) {
try {
this.initDB();
if(!this.mDBConn) return;
if(!this.deleteKeyValueStatement) {
this.deleteKeyValueStatement = this.mDBConn.createStatement("DELETE FROM keyvalues WHERE key = ?1");
}
this.deleteKeyValueStatement.bindUTF8StringParameter(0, key);
this.deleteKeyValueStatement.execute();
} catch(e) {
log.exception(e);
} finally {
// if error before execute, reset might be needed ?
this.deleteKeyValueStatement.reset();
}
};
// saving a key/value pair in the sqlite database
// expire is the number of day the data is valid. After that, it will be erased when accessed
YOONO_KEYVALUEDB.setKeyValue = function(key, value, daysValid) {
this.initDB();
if(!this.mDBConn) return;
if (!this.mDBConn.transactionInProgress)
this.mDBConn.beginTransactionAs(this.mDBConn.TRANSACTION_DEFERRED);
try {
var expire = 0;
if(daysValid) {
var now = Math.floor((new Date().getTime())/1000);
expire = now + (daysValid * 86400); // 86400 seconds in a day
}
if(! this.setKeyValueStatement) {
this.setKeyValueStatement = this.mDBConn.createStatement("INSERT OR REPLACE INTO keyvalues VALUES (?1, ?2, ?3) ");
}
this.setKeyValueStatement.bindUTF8StringParameter(0, key);
this.setKeyValueStatement.bindUTF8StringParameter(1, value);
this.setKeyValueStatement.bindInt32Parameter(2, expire);
this.setKeyValueStatement.execute();
} catch(e) {
log.error('YOONO_CMPT.setKeyValue : ' + e);
} finally {
// if error before execute, reset might be needed ?
this.setKeyValueStatement.reset();
}
if (!this.commitTimer) {
var self=this;
this.commitTimer={
timeout : 2000,
timer : CL['@mozilla.org/timer;1'].createInstance(CI.nsITimer),
start : function () {
this.timer.initWithCallback(this, this.timeout, this.timer.TYPE_ONE_SHOT);
},
stop : function () {
this.timer.cancel();
self.mDBConn.commitTransaction();
self.commitTimer=null;
},
notify : function(timer) {
try {
self.mDBConn.commitTransaction();
self.commitTimer=null;
} catch(e) {
log.exception(e);
}
}
};
this.commitTimer.start();
}
/*
var logVal = value;
if(value && (value.length>500)) {
logVal = value.substr(0, 230) + ' [... VALUE TOO LARGE TO BE LOGGED ...] ' + value.substr(value.length - 250);
}
log.debug('Key saved : ' + key + ' value ' + logVal);
*/
};
YOONO_KEYVALUEDB.getKeyValueList = function(keyPrefix) {
var result = new Object();
try {
this.initDB();
if(!this.mDBConn) return result;
if(! this.getKeyValueListStatement) {
this.getKeyValueListStatement = this.mDBConn.createStatement('SELECT key, value, expire FROM keyvalues WHERE key LIKE ?1');
}
log.debug('Key prefix search : ' + keyPrefix);
this.getKeyValueListStatement.bindUTF8StringParameter(0, keyPrefix + '%');
var value = '';
var key = '';
var expire = 0;
var now = Math.floor((new Date().getTime())/1000);
var toDelete = new Array();
while (this.getKeyValueListStatement.executeStep()) {
key = this.getKeyValueListStatement.getUTF8String(0);
value = this.getKeyValueListStatement.getUTF8String(1);
expire = this.getKeyValueListStatement.getInt32(2);
if((expire != 0) && (expire <= now)) {
/*
if(YOONO_PREFS.get('debug.level') >4) // save perf on string concat in loops
log.debug('Deleting expired (' + expire + ') key : ' + key + '=' + value);
*/
// can't delete in table while reading cursor is open
toDelete.push(key);
} else {
result[key] = value;
/*
if(YOONO_PREFS.get('debug.level') >4) // save perf on string concat in loops
log.debug('Key found : ' + key + ' valid till ' + expire);
*/
}
}
} catch(e) {
log.exception(e);
} finally {
this.getKeyValueListStatement.reset();
}
// deleting expired values found
for(var i=0 ; i < toDelete.length; i++) {
this.deleteKeyValue(toDelete[i]);
}
return result;
};